//
//  ZZOAuthViewModel.swift
//  web
//
//  Created by 张卓 on 2017/1/31.
//  Copyright © 2017年 ZZ. All rights reserved.
//

import UIKit
/*
  - 帮助OAuthVC请求数据
  - 帮助OAuthVC保存用户模型和提供数据给其他控制器
 
 */
class ZZOAuthViewModel: NSObject {
    //全局访问点
    static let shared:ZZOAuthViewModel = ZZOAuthViewModel()
    
    //路径
    let file = (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last! as NSString).appendingPathComponent("userAccount.archiver")
    //个人信息对象(解决频繁访问沙盒的弊端)
    var userAccountModel: ZZUserAccountModel?
    ///访问令牌(计算型属性,每次使用都要判断是否过期)
    var accessToken: String?{
//        //第一次登陆(userAccountModel == nil)
//        if userAccountModel == nil{
//            return nil
//        }else {
//            //不是第一次登陆, 已经保存过数据
//            //但是需要判断是否过期\
//            //代表没有过期
//            if userAccountModel?.expires_Date?.compare(Date()) == ComparisonResult.orderedDescending{
//                return userAccountModel?.access_token
//            }else {
//                //已经过期
//                return nil
//            }
//            
//        }
        //代表没有过期
        if userAccountModel?.expires_Date?.compare(Date()) == ComparisonResult.orderedDescending{
            return userAccountModel?.access_token
        }else {
            //已经过期
            return nil
        }
    }
    //判断用户是否登陆
    /*
        - 如果accessToken有值,就代表登陆,反之则没有登陆
     */
    var isLogin: Bool{
//        if accessToken != nil {
//            return true
//        }else{
//            return false
//        }
        return accessToken != nil
        
    }
    
    
    //重写init方法
    override init() {
        super.init()
        //给userAccountModel赋值
        userAccountModel = getUserAccountModel()
    }
    
    

}
//保存和获取用户信息模型数据
extension ZZOAuthViewModel {
    
    //保存模型
    func saveUserAccountMode(userAccountModel: ZZUserAccountModel){
        //解决第一次获取数据为nil的BUG
        self.userAccountModel = userAccountModel
        
        //保存
        NSKeyedArchiver.archiveRootObject(userAccountModel, toFile: file)
    }
    
    //获取模型
    func getUserAccountModel()->ZZUserAccountModel?{
        //获取
        // as? 如果用户首次登陆,没有保存数据,获取出来的就应该为nil
        let userAccountModel = NSKeyedUnarchiver.unarchiveObject(withFile: file) as? ZZUserAccountModel
        return userAccountModel
    }
    
}
//OAuth界面请求数据
extension ZZOAuthViewModel {
    //https://api.weibo.com/oauth2/access_token
    //请求获取accessToken
    func getUserAccount(code:String, isFinish:@escaping (Bool)->()) {
        HMNetworkTools.shared.loadUserAccount(code: code, success: { (response) in
            //判断response是否为nil 而且是否是一个字典
            guard let res = response as? [String: Any] else {
                isFinish(false)
                return
            }
            //字典转模型
            let userAccountModel = ZZUserAccountModel.yy_model(withJSON: res)
            // 判断是否为nil
            guard let u = userAccountModel else {
                isFinish(false)
                return
            }
            // 请求个人信息数据
            self.getUserInfo(userAccountModel: u,isFinish: isFinish)
//            print(userAccountModel)
          
        }) { (error) in
            print("失败",error)
            isFinish(false)
        }

    }
    //获取用户信息数据
    func getUserInfo(userAccountModel: ZZUserAccountModel, isFinish:@escaping (Bool)->()){
        HMNetworkTools.shared.loadUserInfo(userAccountModel: userAccountModel, success: { (response) in
            //        print("成功",response)
            //判断response是否为nil.且是否可以转换成字典
            guard let res = response as? [String : Any] else {
                isFinish(false)
                return
            }
            //赋值
            userAccountModel.screen_name = res["screen_name"] as? String
            userAccountModel.avatar_large = res["avatar_large"] as? String
            //最终成功了
            //保存用户模型
            self.saveUserAccountMode(userAccountModel: userAccountModel)
            isFinish(true)
//            print(userAccountModel)
            
            
        }) { (error) in
            print("错误",error)
            isFinish(false)
        }
        
        
    }
    
    
}
